Rotace bitmapy

Otázka od: David Kraina

6. 6. 2004 17:41

Dobry den,
 nekolik hodin jsem se marne snazil dosahnout rotace predane TBitmapy na
90?/180?/270?, ale vzdy jsem nekde ztroskotal, predevsim na obrazcich s lichym
pomerem stran.

Nemate nekdo nejakou sikovnou procedurku ?

Diky

 S pozdravem

  
David Kraina, DKx
---------------------------
Vedouci vyvojarskeho tymu MX-3, programator

http://DKx.MX-3.cz
http://www.MX-3.cz
 


Odpovedá: Martin Kasman

6. 6. 2004 18:21

Na pootocenie obrazku mozes pouzit toto:

procedure TMain.BtnOtocDopravaClick(Sender: TObject);
 //Pootocenie o -90 stupnov
 var X, Y: Integer;
begin
PomocnyImage.Picture.Graphic:=Image2.Picture.Graphic;
FOR X:=0 To (Image2.Width-1) DO
 FOR Y:=0 To (Image2.Height-1) DO
  begin
  Image2.canvas.pixels[X, Y]:=PomocnyImage.Canvas.Pixels[Y,
Image2.Width-1-X];
 end;
end;

procedure TMain.BtnPreklopZvisloClick(Sender: TObject);
 //Zvysle preklopenie
 var X, Y: Integer; C: TColor;
begin
FOR Y:=0 To (Image2.Height-1) DIV 2 DO
 FOR X:=0 To (Image2.Width-1) DO
  begin
  C:=Image2.canvas.pixels[X, Y];
  Image2.canvas.pixels[X, Y]:=Image2.canvas.pixels[X, Image2.Height-1-Y];
  Image2.canvas.pixels[X, Image2.Height-1-Y]:=C;
 end;
end;

a ostatne si uz vytvor. Vravis, ze chces, aby to pretacalo aj ine velkosti
obrazkov. Ja by som to riesil tak, ze by som obrazok najprv (pred otocenim)
roztiahol na rovnaku sirku a vysku a po otoceni by som obrazok vratil do
povodnych rozmerov (pripadne by som prehodil sirku s vyskou). Na zmenu sirky
a vysky obrazku sa da pouzit tato funkcia:

procedure BmpToJpeg(Bmp: TBitmap; Q: TJpegQualityRange; var Jpg:
TJpegImage);
begin
Jpg.CompressionQuality := Q;
Jpg.Assign(Bmp);
end;

procedure BmpVelkost(var Image: TImage; Sirka, Vyska: Integer);
 var
 Jpg: TJpegImage;
 SCALEX, ScaleY: Double;
begin
 begin
 Jpg:=TJpegImage.Create;
 try
  BmpToJPeg(Image.Picture.Bitmap, 100, Jpg);
  SCALEX := Sirka / Jpg.Width;
  ScaleY := Vyska / Jpg.Height;
  Image.Picture.Bitmap:=Image.Picture.Bitmap;
  Image.Picture.Bitmap.Width := Round(Jpg.Width * SCALEX);
  Image.Picture.Bitmap.Height := Round(Jpg.Height * ScaleY);

Image.Picture.Bitmap.Canvas.StretchDraw(Image.Picture.Bitmap.Canvas.Cliprect
, Jpg);
  Image.Picture.Bitmap:=Image.Picture.Bitmap;
  finally
  Jpg.Free;
  end;
 end;
end;

Pekny den praje www.MartinKasman.sk

----------------------------
Prispevky z tejto konferencie najdete rozdelene v kategoriach na adrese
www.martinkasman.sk, v sekcii Delphi / konferencia

----- Original Message -----
From: "David Kraina" <dkx@seznam.cz>
> Dobry den,
> nekolik hodin jsem se marne snazil dosahnout rotace predane TBitmapy na
90?/180?/270?, ale vzdy jsem nekde ztroskotal, predevsim na obrazcich s
lichym pomerem stran.


Odpovedá: Pavol Stugel, NETGraphics

6. 6. 2004 18:41

hehe, tak som sa kukol do starych zdrojakov, a aky som bol ja supak, no co mas
to tu
(je to divne napisane ale malo by to fungovat):

procedure FlipVertical(b: TBitmap);
var s,d: PWord;
     yy: Integer;
     temp: pointer;
begin

GetMem(temp, b.Width * 3);
for yy:= 0 to (b.Height - 1) div 2 do
begin
   s:= b.scanline[yy];
   d:= b.scanline[b.Height-1-yy];
   move(s^, temp^, b.width * 3);
   move(d^, s^, b.width * 3);
   move(temp^, d^, b.width * 3);
end;

FreeMem( temp);
end;

procedure FlipHorizontal(b: TBitmap)
var
   s1,d1: ^Integer;
   xx,yy: Integer;
begin
     for yy:= 0 to b.Height - 1 do
       begin
         s1:= b.ScanLine[yy];
         d1:= b.ScanLine[yy];
         Inc(d1, b.Width-1);
         For xx:= 0 to (b.Width-1) div 2 do
           begin
             Swap(s1^,d1^);
             Inc( s1);Dec(d1);
           end;
       end;
end;

v mojej kniznici http://graph64.netgraphics.sk toho najdes viac.

palo


Odpovedá: David Kraina

6. 6. 2004 19:06

To je sice hezke, ale psal jsem, ze tento postup je prilis pomaly - pri extremu
budu potrebovat otocit 2500 obrazku pri kazdem pohybu mysi.

 S pozdravem

  
David Kraina, DKx
---------------------------
Vedouci vyvojarskeho tymu MX-3, programator

http://DKx.MX-3.cz
http://www.MX-3.cz



----- Original Message -----
From: Martin Kasman
Na pootocenie obrazku mozes pouzit toto:
....
  Image2.canvas.pixels[X, Y]:=PomocnyImage.Canvas.Pixels[Y,Image2.Width-1-X];